package net.atos.java.example.boodschappen.client;

import java.util.List;

import net.atos.java.example.boodschappen.model.Boodschap;
import net.atos.java.example.boodschappen.shared.BoodschappenService;
import net.atos.java.example.boodschappen.shared.BoodschappenServiceAsync;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.view.client.ListDataProvider;

/**
 * Algemeen boodschappen paneel.
 * 
 * @author Pal Hargitai
 */
public class BoodschappenPanel extends FlowPanel {

	/** Boodschappen service. */
	private BoodschappenServiceAsync boodschappenService = GWT.create(BoodschappenService.class);
	/** Aanbieder voor de boodschappen. */
	private ListDataProvider<Boodschap> dataProvider;
	/** De tabel voor de boodschappen. */
	private CellTable<Boodschap> table;

	/**
	 * Maakt het panel aan.
	 */
	public BoodschappenPanel() {
		super();
		// Maak de tabel.
		table = new CellTable<Boodschap>();
		table.addColumn(new NaamColumn(), "Naam");
		table.addColumn(new HoeveelheidColumn(), "Hoeveelheid");
		table.addColumn(new EenheidColumn(), "Eenheid");
		table.addColumn(new AfvinkColumn(), "Hebben we!");
		// Geef de tabel data.
		dataProvider = new ListDataProvider<Boodschap>();
		dataProvider.addDataDisplay(table);
		// Haal de data op.
		boodschappenService.ophalenBoodschappen(new BoodschappenCallback());
		add(table);
	}

	/**
	 * Terug koppeling voor de gezochte boodschappen.
	 * 
	 * @author Pal Hargitai
	 */
	public class BoodschappenCallback implements AsyncCallback<List<Boodschap>> {
		/** {@inheritDoc} */
		@Override
		public void onFailure(Throwable caught) {
			Window.alert(caught.getMessage());
		}

		/** {@inheritDoc} */
		@Override
		public void onSuccess(List<Boodschap> result) {
			dataProvider.setList(result);
			dataProvider.flush();
		}
	}

	/**
	 * Naam kolom.
	 * 
	 * @author Pal Hargitai
	 */
	public class NaamColumn extends TextColumn<Boodschap> {
		/** Default constructor. */
		public NaamColumn() {
			setSortable(true);
		}

		/** {@inheritDoc} */
		@Override
		public String getValue(Boodschap object) {
			return object.getBoodschap();
		}
	}

	/**
	 * Hoeveelheid kolom.
	 * 
	 * @author Pal Hargitai
	 */
	public class HoeveelheidColumn extends TextColumn<Boodschap> {
		/** Default constructor. */
		public HoeveelheidColumn() {
			setSortable(true);
		}

		/** {@inheritDoc} */
		@Override
		public String getValue(Boodschap object) {
			if (object.getHoeveelheid() == null) {
				return "";
			} else {
				return object.getHoeveelheid().toString();
			}
		}
	}

	/**
	 * Kolom voor hoeveelheid eenheid.
	 * 
	 * @author Pal Hargitai
	 */
	public class EenheidColumn extends TextColumn<Boodschap> {
		/** Default constructor. */
		public EenheidColumn() {
			setSortable(true);
		}

		/** {@inheritDoc} */
		@Override
		public String getValue(Boodschap object) {
			if (object.getEenheid() == null) {
				return "";
			} else {
				return object.getEenheid().toString();
			}
		}
	}

	/**
	 * Kolom voor het afvinken van de boodschap.
	 * 
	 * @author Pal Hargitai
	 */
	public class AfvinkColumn extends Column<Boodschap, String> {
		/** Default constructor. */
		public AfvinkColumn() {
			// Kolom heeft een knop.
			super(new ButtonCell());
			setFieldUpdater(new CheckFieldUpdater());
		}

		/** {@inheritDoc} */
		@Override
		public String getValue(Boodschap object) {
			return "Check!";
		}
	}

	/**
	 * Vinkt de boodschap af.
	 * 
	 * @author Pal Hargitai
	 */
	public class CheckFieldUpdater implements FieldUpdater<Boodschap, String> {
		/** {@inheritDoc} */
		@Override
		public void update(int index, Boodschap object, String value) {
			boodschappenService.afvinkenBoodschap(object.getIdentificatie(), new VerversenCallback());
		}
	}

	/**
	 * Maakt de terug koppeling van het ophalen van de boodschappen.
	 * @return De terug koppeling.
	 */
	public AsyncCallback<List<Boodschap>> createOphalenCallback() {
		return new BoodschappenCallback();
	}

	/**
	 * Terug koppeling voor het verversen.
	 * 
	 * @author Pal Hargitai
	 */
	public class VerversenCallback implements AsyncCallback<Void> {
		/** {@inheritDoc} */
		@Override
		public void onFailure(Throwable caught) {
			Window.alert(caught.getMessage());
		}

		/** {@inheritDoc} */
		@Override
		public void onSuccess(Void result) {
			boodschappenService.ophalenBoodschappen(new BoodschappenCallback());
		}
	}

	/**
	 * Verstopt het paneel.
	 * 
	 * @author Pal Hargitai
	 */
	public class VerstopCallback implements AsyncCallback<Void> {
		/** {@inheritDoc} */
		@Override
		public void onFailure(Throwable caught) {
			Window.alert(caught.getMessage());
		}
	
		/** {@inheritDoc} */
		@Override
		public void onSuccess(Void result) {
			setVisible(false);
		}
	}
}
